package com.example.util;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTCreator;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;
import org.springframework.stereotype.Component;

import java.util.Calendar;
import java.util.List;
import java.util.Map;

@Component
public class JwtUtil {

    /**
     * 创建JWT
     * @param map
     * @return
     */
    public String creatJWT(Map<String,String> map, List<String> authlist){
        //设置Jwt的超时时间
        Calendar calendar = Calendar.getInstance();
        calendar.add(Calendar.MINUTE,1200);
        //创建JWT，使用JWT.creat()方法进行创建
        //此时builder对象中默认设置了header--表头，默认为JWT
        JWTCreator.Builder builder = JWT.create();
        //将信息写入有效载荷中payload
        for (String key:map.keySet()){
            //通过withClaim方法传入传输到payload中
            builder.withClaim(key,map.get(key));
        }
        builder.withClaim("authlist",authlist);
        //利用builder和签名创健token，同时利用Calender类设置过期时间
        String token = builder.withExpiresAt(calendar.getTime()).sign(Algorithm.HMAC256("lovo"));
        return token;
    }

    public boolean verifyToken(String token){
        try {
            //创建解码对象，利用JWT签名去完成解码对象的创建
            JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256("lovo")).build();
            //包含了JWT解码信息
            DecodedJWT decodedJWT = jwtVerifier.verify(token);
            return true;
        }catch (Exception e){
            return false;
        }
    }


    /**
     * 通过token和键解码信息
     * @param token
     * @param key
     * @return
     */
    public String verify(String token,String key){
        //创建解码对象，利用JWT签名去完成解码对象的创建
        JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256("lovo")).build();
        //包含了JWT解码信息
        DecodedJWT decodedJWT = jwtVerifier.verify(token);
        //利用键得到存放在有效负载payload的数据
        String value = decodedJWT.getClaim(key).asString();
        return value;
    }

    public List<String> getUserAuth(String token){
        //创建解码对象，利用JWT签名去完成解码对象的创建
        JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256("lovo")).build();
        //包含了JWT解码信息
        DecodedJWT decodedJWT = jwtVerifier.verify(token);
        return decodedJWT.getClaim("authlist").asList(String.class);
    }

}
